/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.usbcali.proyectofinal.logica;

import co.edu.usbcali.proyectofinal.dao.IRetirosDAO;
import co.edu.usbcali.proyectofinal.modelo.Retiros;
import co.edu.usbcali.proyectofinal.modelo.RetirosId;
import java.math.BigDecimal;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author alejandro
 */
@Scope("singleton")
@Service
public class RetirosLogica implements IRetirosLogica {

    @Autowired
    private IRetirosDAO retirosDAO;

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void crearRetiro(Retiros retiros) throws Exception {

        if (retiros == null) {
            throw new Exception("El retiro es nulo");
        }

        if (retiros.getCuentas() == null) {
            throw new Exception("La cuenta es obligatoria");
        }

        if (retiros.getUsuarios() == null) {
            throw new Exception("El usuario es obligatorio");
        }

        if (retiros.getId().getRetCodigo() == 0) {
            throw new Exception("El Id del retiro es obligatorio");
        }

        if (retiros.getId().getCueNumero() == null) {
            throw new Exception("El numero de cuenta es obligatorio");
        }

        if (retiros.getRetDescripcion() == null) {
            throw new Exception("La descripcion del retiro es obligatoria");
        }

        if (retiros.getRetFecha() == null) {
            throw new Exception("La fecha del retiro es obligatoria");
        }

        if (retiros.getRetValor() == null || retiros.getRetValor()== BigDecimal.ZERO) {
            throw new Exception("El valor del retiro es obligatorio");
        }

        if (retiros.getCuentas().getCueNumero() == null) {
            throw new Exception("El numero de la cuenta es obligatorio");
        }

        if (retiros.getUsuarios().getUsuCedula() == 0) {
            throw new Exception("La cedula del usuario es obligatoria");
        }

        Retiros entidad = retirosDAO.consultarRetiroID(retiros.getId());

        if (entidad != null) {
            throw new Exception("El retiro solicitado ya existe");
        }

        retirosDAO.crearRetiro(retiros);
    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void modificarRetiro(Retiros retiros) throws Exception {
        if (retiros == null) {
            throw new Exception("El retiro es nulo");
        }

        if (retiros.getCuentas() == null) {
            throw new Exception("La cuenta es obligatoria");
        }

        if (retiros.getUsuarios() == null) {
            throw new Exception("El usuario es obligatorio");
        }

        if (retiros.getId().getRetCodigo() == 0) {
            throw new Exception("El Id del retiro es obligatorio");
        }

        if (retiros.getId().getCueNumero() == null) {
            throw new Exception("El numero de cuenta es obligatorio");
        }

        if (retiros.getRetDescripcion() == null) {
            throw new Exception("La descripcion del retiro es obligatoria");
        }

        if (retiros.getRetFecha() == null) {
            throw new Exception("La fecha del retiro es obligatoria");
        }

        if (retiros.getRetValor() == null || retiros.getRetValor()== BigDecimal.ZERO) {
            throw new Exception("El valor del retiro es obligatorio");
        }

        if (retiros.getCuentas().getCueNumero() == null) {
            throw new Exception("El numero de la cuenta es obligatorio");
        }

        if (retiros.getUsuarios().getUsuCedula() == 0) {
            throw new Exception("La cedula del usuario es obligatoria");
        }

        Retiros entidad = retirosDAO.consultarRetiroID(retiros.getId());

        if (entidad == null) {
            throw new Exception("El retiro solicitado no existe");
        }

        entidad.setCuentas(retiros.getCuentas());
        entidad.setRetDescripcion(retiros.getRetDescripcion());
        entidad.setRetFecha(retiros.getRetFecha());
        entidad.setRetValor(retiros.getRetValor());
        entidad.setUsuarios(retiros.getUsuarios());

        retirosDAO.crearRetiro(entidad);
    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void borrarRetiro(Retiros retiros) throws Exception {
        if (retiros == null) {
            throw new Exception("El retiro es nulo");
        }

        if (retiros.getId().getRetCodigo() == 0) {
            throw new Exception("El codigo del retiro es obligatorio");
        }

        if (retiros.getId().getCueNumero() == null) {
            throw new Exception("El numero de cuenta es obligatorio");
        }

        Retiros entidad = retirosDAO.consultarRetiroID(retiros.getId());

        if (entidad == null) {
            throw new Exception("El retiro solicitado no existe");
        }

        retirosDAO.borrarRetiro(entidad);
    }

    @Override
    @Transactional(readOnly = true)
    public Retiros consultarRetiroID(RetirosId id) throws Exception {
        return retirosDAO.consultarRetiroID(id);
    }

    @Override
    @Transactional(readOnly = true)
    public List<Retiros> consultarTodosLosRetiros() throws Exception {
        return retirosDAO.consultarTodosLosRetiros();
    }

}
